#include "draw.h"
#include "draw_char.h"
#include"draw_bmp.h"


/*
    设置控制台的背景色，及字符颜色
    bak_color：背景色 取值区间[0x0,0xf]
    for_color：字符颜色 取值区间[0x0,0xf]
*/
void set_con_color(int bak_color,int for_color)
{
    char cmd_str[10];

    if(bak_color>0xf)
        bak_color=0xf;
    if(for_color>0xf)
        for_color=0xf;

    sprintf(cmd_str,"color %x%x",bak_color,for_color);
    system(cmd_str);

}


/*
    初始化窗口属性 windows标准api接口 但是我用的还有问题 不过算了 不影响效果

*/
 void  console_init(HANDLE * handle_out, CONSOLE_SCREEN_BUFFER_INFO * screen_info,COORD pos,int fore_color,int back_color)
{
     COORD size = {MAX_X, MAX_Y};      //定义一个坐标结构体
     COORD posShadow={0,0};
    * handle_out = GetStdHandle(STD_OUTPUT_HANDLE);   //获得标准输出设备句柄
    SetConsoleTitle("shell");     //设置窗口标题为“控制台窗口操作”
    SetConsoleScreenBufferSize(*handle_out, size);   // 重新设置缓冲区大小
    SMALL_RECT rc = {0, 0, MAX_X, MAX_Y};     // 重置窗口位置和大小
    SetConsoleWindowInfo(*handle_out, 1, &rc);
    SetConsoleTextAttribute(*handle_out, back_color);
    SetConsoleTextAttribute(*handle_out, fore_color);
    GetConsoleScreenBufferInfo(*handle_out, screen_info);   //获取窗口信息
    set_con_color(0x2,0xf);
    system("title gaojielinuxer");
}


/*
    显示一个矩形阴影区
    posShadow: 矩形的起点坐标
    shadow : 阴影的颜色值
*/

void shadow_show( HANDLE  handle_out,COORD posShadow,int width,int height ,WORD shadow)
{
    int i;
    char buf[128];
    for (i=0; i<height; ++i)     //先输出阴影框
        {
            FillConsoleOutputAttribute(handle_out, shadow, width, posShadow, buf);
            posShadow.Y++;
        }
}

/*
对存储在显存数组framebuffer[][]里的数据进行显示,clean_flag为1，则会清空显存数组
目前开启宏DIRECT_SHOW，直接显示能加速显示，故show_fb(.....)没用到

*/

void show_fb(HANDLE handle_out,int clean_flag)
{
    int x,y;

    COORD pos_pen;
    system("cls");
    for(y=0;y<MAX_Y;y++)
        for(x=0;x<MAX_X;x++)
        {
            pos_pen.X=x;
            pos_pen.Y=y;
            WriteConsoleOutputCharacter(handle_out,&framebuffer[x][y], 1, pos_pen, NULL);   //输出字符串

        }


    if(clean_flag==1)
    {
        for(y=0;y<MAX_Y;y++)
            for(x=0;x<MAX_X;x++)
               framebuffer[x][y]=' ';
    }
}

/*
清空屏幕显示，但不会请显存数组
*/
void clean_fb()
{
    system("cls");

}

/*
    程序入口函数，有些demo绘制参考
*/

int main(int argc,char *argv[])
{
    HANDLE handle_out;                              //定义一个句柄
    COORD pos = {0, 0};   //定义一个坐标结构体
    CONSOLE_SCREEN_BUFFER_INFO screen_info; //定义窗口缓冲区信息结构体

    console_init( &handle_out,&screen_info,pos , FORE_RED,BACK_YELLOW);

    COORD pos1 = {10,10};
    COORD pos2 = {30,25};
    COORD pos3 = {60,10};

    shadow_show( handle_out,pos1,20,20 ,0x10); //显示矩形阴影
    _getch();   //输入一个字符继续绘图，这个字符不会显示到屏幕上
    clean_fb(); //清除之前的显示
    draw_line(handle_out,pos1,pos2,"a");//画线
    draw_line(handle_out,pos2,pos3,"b");//画线
    _getch();
    clean_fb(); //清除之前的显示
    draw_circle(handle_out,pos2,20,"k",0 ,20); //画字符空心圆
    _getch();
    draw_circle(handle_out,pos2,15,"k",1 ,20); //画字符实心圆
    _getch();
    clean_fb(); //清除之前的显示
    draw_rect(handle_out,pos1,30,30,"a",1); //画字符矩形
    _getch();
    draw_rect(handle_out,pos2,30,30,"g",0); //画字符矩形
    _getch();
    clean_fb(); //清除之前的显示
    show_char(handle_out,"高","a" ,pos1);//绘字符汉字
    show_char(handle_out,"杰","b" ,pos2);//绘字符汉字
    show_char(handle_out,"林","c" ,pos3);//绘字符汉字
    _getch();
    clean_fb(); //清除之前的显示
     draw_bmp_file("1.bmp");//绘字符单色bmp位图
     _getch();
     clean_fb(); //清除之前的显示
    draw_bmp_file("2.bmp");//绘字符单色bmp位图
    _getch();
    clean_fb(); //清除之前的显示
     draw_bmp_file("3.bmp");//绘字符单色bmp位图
    CloseHandle(handle_out);    //关闭标准输出设备句柄
    return 0;
}